package modelo.torres;

// paquetes de proyecto
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;

import modelo.enemigos.Enemigo;
import modelo.enemigos.ManejadorEnemigos;
import modelo.interfaces.Manejador;
import modelo.interfaces.Posicionable;
import modelo.juego.Configuracion;
import modelo.juego.Jugador;
import modelo.mapa.Casillero;
import modelo.mapa.Mapa;

public class ManejadorTorres implements Manejador, Serializable {
	
	
	private static final long serialVersionUID = 2227067772966924368L;

	private Collection<Torre> torres;
	private Mapa mapa;
	private ManejadorEnemigos manejadorEnemigos;
	private int intervalo;

	public ManejadorTorres(Mapa m, Manejador e, Jugador j) {
		this.mapa = m;
		this.manejadorEnemigos = (ManejadorEnemigos) e;
		this.torres = new LinkedList<Torre>();
		this.intervalo = 1;
	}

	public Collection<Torre> getTorres() {
		return this.torres;
	}

	public void crearTorre(Casillero casillero, CreadorTorre tipo) {

		if (!this.mapa.esCamino(casillero, 0)) {
			Collection<Posicionable> elementos = mapa.elementosEnRango(casillero, 0);

			if (elementos.isEmpty()) {
				try {
					Torre unaTorre = tipo.CrearTorre(casillero);
					this.mapa.posicionarPosicionable(casillero, unaTorre);
					this.torres.add(unaTorre);
				} catch (NoAlcanzaElDineroException e) {
				}
			}
		}
	}

	public void latir() {
		if ((intervalo % Configuracion.INTERVALO_ATAQUE_TORRE) == 0) {
			Iterator<Torre> itTorres = this.torres.iterator();

			while (itTorres.hasNext()) {
				Torre torre = itTorres.next();

				LinkedList<Enemigo> enemigosDeTorre = (LinkedList<Enemigo>) this.mapa.enemigosEnRango(torre.getCasillero(), torre.getAlcance());
				Enemigo objetivo = torre.definirObjetivo(enemigosDeTorre);
				if (objetivo != null) {
					this.manejadorEnemigos.Daniar(objetivo, torre.getDanio());
				}
			}
		}
		this.intervalo++;
	}// fin latir

	
	public void redibujarComponentes() {
		Iterator it = torres.iterator();
		while (it.hasNext()) {
			Torre t = (Torre) it.next();
			t.reDibujar();
			
		}
		
	}

}
